iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
AI/ ML & Data

使用 jq 處理資料系列 第 18

Day18: 練習用 jq 追颱風消息 - @tsv

  • 分享至 

  • xImage
  •  

我們繼續看看山陀兒颱風警報的資料吧。

https://ithelp.ithome.com.tw/upload/images/20241002/20078389YDhQedYPno.png


認識了 slice 和 split之後,我們取得資料的 jq 主程式如下:

  • 用於 jqplay
jq -c '[.records.tropicalCyclones.tropicalCyclone[] | select(.typhoonName=="KRATHON") | .analysisData.fix[] | [.fixTime[0:13], (.coordinate|split(",")[0]), (.coordinate|split(",")[1]), .pressure, .maxWindSpeed, .maxGustSpeed, .movingDirection, .movingPrediction[0].value]][]'
  • 用於命令提示字元
jq -c "[.records.tropicalCyclones.tropicalCyclone[] | select(.typhoonName==\"KRATHON\") | .analysisData.fix[] | [.fixTime[0:13], (.coordinate|split(\",\")[0]), (.coordinate|split(\",\")[1]), .pressure, .maxWindSpeed, .maxGustSpeed, .movingDirection, .movingPrediction[0].value]][]"

接下來,我希望這些資訊呈現的樣子更簡潔一點,尤其在 terminal 當中,可以清楚看各欄資訊。jq 正好有內建合適的工具–– @tsv 💡

jq @tsv 格式化字串函式

輸入陣列後,使用 | @tsv ,這個函式會幫助我們使用 tab 分隔字串格式呈現,也就是以TSV (tab-separated values)呈現。陣列的每個元素會用一行呈現,元素內的每個值則會用 tab 分隔。

以底下這個字串陣列為例:

["一天", "有一盤小菜", "在路上走著走著", "就被端走了"]
  • 直接使用 | @tsv 結果為 "一天\t有一盤小菜\t在路上走著走著\t就被端走了"

https://ithelp.ithome.com.tw/upload/images/20241001/20078389Sv44JKKUEx.png

❗ 我們要的是 tab 分隔,但是這個結果被轉為字串了?
💡 回顧 Day11: jq 線上工具 jqplay 介紹的時候,有些參數可以使用。
-r Raw Output: 將輸出的資料視為一般文字,不會解析成JSON,外層如果是字串不會加上引號
  • 使用 | @tsv搭配 -r 結果為 一天 有一盤小菜 在路上走著走著 就被端走了

https://ithelp.ithome.com.tw/upload/images/20241001/20078389Ay7j5dbNUe.png

  • 即使多來幾盤小菜,結果也是一樣的

https://ithelp.ithome.com.tw/upload/images/20241001/20078389q3JwdoVr0b.png

✨ 這就是我們要的 tab 分隔,可以直接作為 颱風消息與警報-熱帶氣旋路徑 的顯示格式 ✨

現在可以修改我們取得資料的 jq 主程式,加上標題、顯示最後5筆,如下:

  • 用於 jqplay
jq -c -r '["時間     ","經度","緯度","氣壓","風速MAX","陣風MAX","方向 ","預測"],[.records.tropicalCyclones.tropicalCyclone[] | select(.typhoonName=="KRATHON") | .analysisData.fix[-5:][] | [.fixTime[0:13], (.coordinate|split(",")[0]), (.coordinate|split(",")[1]), .pressure, .maxWindSpeed, .maxGustSpeed, .movingDirection, .movingPrediction[0].value]][] | @tsv'
  • 用於命令提示字元
jq -c -r " [\"時間     \",\"經度\",\"緯度\",\"氣壓\",\"風速MAX\",\"陣風MAX\",\"方向 \",\"預測\"],[.records.tropicalCyclones.tropicalCyclone[] | select(.typhoonName==\"KRATHON\") | .analysisData.fix[-5:][] | [.fixTime[0:13], (.coordinate|split(\",\")[0]), (.coordinate|split(\",\")[1]), .pressure, .maxWindSpeed, .maxGustSpeed, .movingDirection, .movingPrediction[0].value]][] | @tsv"

修改後,比較成果如下對照:

陣列 https://ithelp.ithome.com.tw/upload/images/20241002/20078389IpviEm7Q72.png
tab分隔 https://ithelp.ithome.com.tw/upload/images/20241002/20078389QBicEWNcSC.png

結論

今天認識了 @tsv@tsv 讓我們整理好的文字陣列資料 能以 tab 做分隔的格式來輸出,終於在 terminal 終能清楚顯示。可參考 原始碼

颱風天,注意安全。擔心可能會停電,於是就早點發文。感謝自己認真的學習。


上一篇
Day17: 練習用 jq 追颱風消息 - 字串 Slice 和 Split
下一篇
Day19: jq 的 if-then-else-end
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言